package com.yudaxian.bi.manage;

import com.yudaxian.bi.common.ErrorCode;
import com.yudaxian.bi.config.RedissonConfig;
import com.yudaxian.bi.exception.BusinessException;
import org.redisson.api.RRateLimiter;
import org.redisson.api.RateIntervalUnit;
import org.redisson.api.RateType;
import org.redisson.api.RedissonClient;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;

/**
 * @Author: yudaxian
 * @Description: Redis限流管理
 * @DateTime: 2024/9/20 13:18
 **/
@Service
public class RedisLimitManage {

    @Resource
    private RedissonClient RedissonClient;

    /**
     * 限流：1分钟两次
     * @param key : 区分不同的限流器，比如用户的id应该分别统计
     */
    public void doRateLimit(String key) {
        RRateLimiter rateLimiter = RedissonClient.getRateLimiter(key);
        rateLimiter.trySetRate(RateType.OVERALL, 2, 1, RateIntervalUnit.MINUTES);
        // 请求来了，获取一个令牌，如果没有令牌，则抛出异常：调用频繁
        boolean acquire = rateLimiter.tryAcquire(1);
        if (!acquire) {
            throw new BusinessException(ErrorCode.TOO_MANY_REQUEST_ERROR);
        }
    }

}
